#ifndef PAGING_H
#define PAGING_H

#include "main.h"
#include "memory.h"
#include "panic.h"

// Flags
#define PAGE_FLAG_PRESENT	1	// Page ist Present
#define PAGE_FLAG_WRITEABLE	2	// Page ist beschreibbar 
#define PAGE_FLAG_USER		4	// Die Flag ist auch vom UserSpace zu erreichen
#define PAGE_FLAG_WRITE_THROUGH	8	// 
#define PAGE_FLAG_DISABLE_CACHE	16	// Caching ist deaktivert, d.h. die Phys. Adresse landet nicht im TLB


/* Mappt den kompletten Speicher (identy mapping) und aktiviert danach Paging
 * Parameter: Größe des RAMs von GRUB in KiloBytes!
 * Rückgaben: Keine
 */
void paging_init (uint32_t);

/* Nimmt eine virtuelle Adresse entgegen und gibt ihre echte physische Position zurück
 * Parameter: Virtuelleadresse
 * Rückgaben: Physischeadresse
 */
void *paging_get_physical_address (void *);

/* Mappt eine physische Page in den virtuellen Adressraum
 * Parameter: Adresse der Page, Neue virtuelle Adresse der Page
 * Rückgaben: Keine
 */
void paging_map_page (void *, void *, uint16_t);

/* Mappt einen Bereich von physikalischen Speicher in den virtuellen Adressraum
 * Parameter: Startadresse (phys.), Länge, Startadresse (virt.), flags
 * Rückgaben: Keine
 */
void paging_map_range (void *, uint32_t, void *, uint16_t);

/* Setzt eine Page auf nicht present
 * Parameter: Adresse im virtuellen Raum
 * Rückgaben: Keine
 */
void paging_set_page_not_present (void *);

/* Überprüft ob eine Page Present ist
 * Parameter: Adresse im virtuellen Raum
 * Rückgaben: TRUE wenn präsent, ansonsten FALSE
 */
BOOL paging_is_page_present (void *);

/* Veranlasst die Leerung des Cache in Falle einer Änderung in einer der Tables
 * Parameter: Keine
 * Rückgaben: Keine
 */
void inline paging_flush_cache (void*);

/* Wird von idt_behandlung bei einem Page Fault aufgerufen
 * Parameter: Pointer auf eine stack_frame Struktur
 * Rückgaben: Keine
 */
void paging_page_fault (struct stack_frame *);

#endif
